package main

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

//gorm demo06 删除

// StudentInfo 1.定义模型
type StudentInfo struct {
	gorm.Model
	Name   string
	Age    int64
	Active bool
}

func main() {
	//2.连接 MySQL 数据库
	db, err := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local")
	if err != nil {
		panic(err)
	}
	defer db.Close()

	//3.把模型与数据库中的表对应起来
	db.AutoMigrate(&StudentInfo{})

	// 4.创建
	s1 := StudentInfo{Name: "htl", Age: 36, Active: true}
	db.Create(&s1)
	s2 := StudentInfo{Name: "swk", Age: 500, Active: false}
	db.Create(&s2)

	//5.删除
	/*
	*~~~ 删除记录时，要确保 主键 字段有值，GORM 会通过主键去删除记录，如果 主键为空，则会删除该 model 的 所有记录 ~~~*
	*~~~ 如果一个 model 又 DeleteAt 字段，它将自动获得软删除的功能。当调用 Delete 方法时，记录不会真正的从数据库中被删除，只会将 DeleteAt 字段的值设置为当前时间 ~~~*
	 */
	db.Delete(&s1)
	//DELETE from student_infos where id=1;

	/*
		根据其他条件来删除数据
	*/
	db.Where("name=?", "swk").Delete(StudentInfo{})
	db.Delete(StudentInfo{}, "name=?", "swk")

	/*
		查询记录时，会忽略被软删除的记录
		Unscoped 方法可以查询被软删除的记录
		Unscoped 方法可以物理删除记录
	*/
	//查询软删除的记录
	var students []*StudentInfo
	db.Unscoped().Where("age=36").Find(&students)
	fmt.Printf("%#v\n", students)

	//物理删除记录
	db.Unscoped().Delete(&s1)
}
